<?php

namespace addons\wechat\controller;

use addons\wechat\library\Config;
use addons\wechat\model\WechatAutoreply;
use addons\wechat\model\WechatCaptcha;
use addons\wechat\model\WechatContext;
use addons\wechat\model\WechatResponse;
use addons\wechat\model\WechatConfig;

use EasyWeChat\Factory;
use addons\wechat\library\Wechat as WechatService;
use EasyWeChat\Kernel\Messages\News;
use EasyWeChat\Kernel\Messages\NewsItem;
use think\Log;
use EasyWeChat\Kernel\Messages\Text;
use app\common\model\Subject\Subject as SubjectModel;
use app\common\model\Product\Order\Order as OrderModel;
use app\common\model\Product\Product as ProductModel;

/**
 * 微信接口
 */
class Index extends \think\addons\Controller
{

    public $app = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->app = Factory::officialAccount(Config::load());
    }

    /**
     *
     */
    public function index()
    {
        $this->error("当前插件暂无前台页面");
    }

    /**
     * 微信API对接接口
     */
    public function api()
    {
        $this->app->server->push(function ($message) {
            $wechatService = new WechatService;

            $matches = null;
            $openid = $message['FromUserName'];
            $to_openid = $message['ToUserName'];

            $unknownMessage = WechatConfig::getValue('default.unknown.message');
            $unknownMessage = $unknownMessage ? $unknownMessage : "";

            switch ($message['MsgType']) {
                case 'event': //事件消息
                    $event = $message['Event'];
                    $eventkey = $message['EventKey'] ? $message['EventKey'] : $message['Event'];
                    //验证码消息
                    if (in_array($event, ['subscribe', 'SCAN']) && preg_match("/^captcha_([a-zA-Z0-9]+)_([0-9\.]+)/", $eventkey, $matches)) {
                        return WechatCaptcha::send($openid, $matches[1], $matches[2]);
                    }
                    switch ($event) {
                        case 'subscribe': //添加关注
                            $subscribeMessage = WechatConfig::getValue('default.subscribe.message');
                            $subscribeMessage = $subscribeMessage ?: "欢迎来到测试号\n使用帮助\n1、发送城市名称，可搜索天气(广州天气)\n2、发送课程名称，可搜索相关课程(php课程)\n3、发送物流单号，可搜索商品物流进度(查物流：2023051111)\n4、发送商品名称，可搜索商品(商品:手机)!";
                            return $subscribeMessage;
                        case 'unsubscribe': //取消关注
                            return '';
                        case 'LOCATION': //获取地理位置
                            return '';
                        case 'VIEW': //跳转链接,eventkey为链接
                            return '';
                        case 'SCAN': //扫码
                            return '';
                        default:
                            break;
                    }

                    $wechatResponse = WechatResponse::where(["eventkey" => $eventkey, 'status' => 'normal'])->find();
                    if ($wechatResponse) {
                        $responseContent = (array)json_decode($wechatResponse['content'], true);
                        $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
                        $data = ['eventkey' => $eventkey, 'command' => '', 'refreshtime' => time(), 'openid' => $openid];
                        if ($wechatContext) {
                            $wechatContext->save($data);
                        } else {
                            $wechatContext = WechatContext::create($data, true);
                        }
                        $result = $wechatService->response($this, $openid, '', $responseContent, $wechatContext);
                        if ($result) {
                            return $result;
                        }
                    }
                    return $unknownMessage;
                case 'text': //文字消息
                case 'image': //图片消息
                case 'voice': //语音消息
                case 'video': //视频消息
                case 'location': //坐标消息
                case 'link': //链接消息
                default: //其它消息
                    //自动回复处理
                    if ($message['MsgType'] == 'text') {
                        $autoreply = null;
                        $autoreplyList = WechatAutoreply::where('status', 'normal')->cache(true)->order('weigh DESC,id DESC')->select();
                        foreach ($autoreplyList as $index => $item) {
                            //完全匹配和正则匹配
                            if ($item['text'] == $message['Content'] || (in_array(mb_substr($item['text'], 0, 1), ['#', '~', '/']) && preg_match($item['text'], $message['Content'], $matches))) {
                                $autoreply = $item;
                                break;
                            }
                        }

                        if ($autoreply) {
                            $wechatResponse = WechatResponse::where(["eventkey" => $autoreply['eventkey'], 'status' => 'normal'])->find();
                            if ($wechatResponse) {
                                $responseContent = (array)json_decode($wechatResponse['content'], true);
                                $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
                                $result = $wechatService->response($this, $openid, $message['Content'], $responseContent, $wechatContext, $matches);
                                if ($result) {
                                    return $result;
                                }
                            }
                        }
                        return  $this->message($message['Content']);
                    }
                    return $unknownMessage;
            }
            return ""; //SUCCESS
        });

        $response = $this->app->server->serve();
        // 将响应输出
        $response->send();
        return;
    }
    /*
     * 消息处理
    */
    public function message($content = null)
    {

        preg_match('/(.*)天气/', $content, $res);
        $city = $res[1] ?? '';
        if ($city) {
            $weatherdata = cache($city);
            if ($weatherdata) {
                return new Text($weatherdata);
            }

            // 天气Api
            $ApiUrl = "http://apis.juhe.cn/simpleWeather/query?city=$city&key=9ab6176129dbb280b54721e4da1a1e78";

            // 通过file_get_contents函数获取到数据 请求是get 不用设置头信息
            $result = file_get_contents($ApiUrl);

            $result = json_decode($result, true);

            // 根据粗错误码显示错误信息
            switch ($result['error_code']) {
                case 10011:
                    return new Text('您当前请求过多，请稍后再试');

                case 10012:
                    return new Text('当前请求过多，请稍后再试');

                case 10020:
                    return new Text('该功能正在维护中');

                case 10021:
                    return new Text('该功能停用~');

                case 207302:
                    return new Text('查询不到该城市的相关信息');

                case 207301:
                    return new Text('错误的查询城市名,请重新查询');

                case 207303:
                    return new Text('网络错误，请重试');
            }

            $data = $result['result'];


            $weatherdata = "当前城市：{$data["city"]}\n当前温度：{$data["realtime"]["temperature"]}\n当前湿度：{$data["realtime"]["humidity"]}\n当前天气：{$data["realtime"]["info"]}\n当前风力：{$data["realtime"]["power"]}\n当前空气质量：{$data["realtime"]["aqi"]}";

            cache($city, $weatherdata);
            return new Text($weatherdata);
        }
        preg_match('/(.*)课程/', $content, $res1);

        $title = $res1[1] ?? '';
        if ($title) {
            $item = SubjectModel::where('title', 'like', '%' . $title . '%')->find();
            if (!$item) {
                return new Text('没有找到相关课程');
            }
            // 获取配置信息
            $url = config('site.url');
            $data = [];
            // 重组的数据存放这里
            $data[] =  new NewsItem([
                'title' => $item['title'],
                'description' => $item['content_text'],
                'image' => $item['thumbs_text'],
                'url'   => $url . "/home/subject/detail/subid/" . $item['id']
            ]);

            return new News($data);
        }
        preg_match('/查物流:(.*)/', $content, $res1);
        $flow = $res1[1] ?? '';
        if ($flow) {
            $order = OrderModel::with('expressquery')->where('expresscode', $flow)->find();
            if (!$order) {
                return new Text('没有找到相关订单');
            }

            $odrerData = "订单号：{$order['code']}\n配送物流：{$order['expressquery']['name']}\n物流单号：{$order['expresscode']}\n下单时间：{$order['createtime']}\n订单专态：{$order['status_text']}";
            return new Text($odrerData);
        }
        preg_match('/商品:(.*)/', $content, $res);
        $shop = $res[1] ?? '';
        if ($shop) {
            $item = ProductModel::where('name', 'like', '%' . $shop . '%')->find();
            if (!$item) {
                return new Text('没有找到相关商品');
            }
            // 获取配置信息
            $url = config('site.vueurl');
            // 重组的数据存放这里
            $data = [];
            $data[] = new NewsItem([
                'title' => $item['name'],
                'description' => $item['content_text'],
                'image' => $item['thumbs_text'],
                'url'  => $url . "/#/product/info?proid=" . $item['id']
            ]);
            return new News($data);
        }
        return $content;
    }


    /**
     * 登录回调
     */
    public function callback()
    {
    }

    /**
     * 支付回调
     */
    public function notify()
    {
        Log::record(file_get_contents('php://input'), "notify");
        $response = $this->app->handlePaidNotify(function ($message, $fail) {
            // 你的逻辑
            return true;
            // 或者错误消息
            $fail('Order not exists.');
        });

        $response->send();
        return;
    }
}
